home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Apple II Magazines (PO)
/
Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A)[a].zip
/
Nibble Volume 10, No. 03 (1989-03)(MicroSPARC)(Side A)[a].po
/
WORKS.OBJ.S
< prev
next >
Wrap
Text File
|
1996-12-24
|
12KB
|
467 lines
*************************
* WORKS.OBJ Source Code *
* BY MIKE JETZER *
* COPYRIGHT (C) 1989 *
* MICROSPARC, INC. *
* CONCORD, MA 01742 *
*************************
* MERLIN ASSEMBLER
ORG $2000
MLI = $BF00
FILEBUF = $2C00 ;Input file buffer
FILE2BUF = $3000 ;Output file buffer
DATABUF = $3400 ;Buffer for input & output data
CV = $25 ;Vertical cursor pos
IBUFF = $200 ;Input buffer
STROBE = $C010 ;Keyboard strobe
PRBL2 = $F94A ;Print # of spaces in X-reg
VTAB = $FC22
HOME = $FC58
WAIT = $FCA8
RDKEY = $FD0C ;Get a key
GETLN1 = $FD6F ;Get a line of input
CROUT = $FD8E ;Output a CR
PRBYTE = $FDDA ;Print hex number held in acc
COUT = $FDED
PRINTOUT MAC ;Print a message
LDX #<]1
LDY #>]1
JSR MSGOUT
<<<
JMP MENU
PASS2BAS DS 1 ;Pass parameter to basic program
* MENU - Do main menu
MENU JSR HOME
LDX #12
JSR PRBL2
PRINTOUT TOPLINE ;Print top line
LDX #4
JSR PRBL2
PRINTOUT SECLINE ;Print second line
LDA #21
STA CV
JSR VTAB
LDX #9
JSR PRBL2
PRINTOUT THRDLINE ;Print third line
LDX #3
JSR PRBL2
PRINTOUT FRTHLINE
LDA #3
STA CV
JSR VTAB
LDX #9
JSR PRBL2
PRINTOUT CONVLINE ;"Convert File"
LDX #9
JSR PRBL2
PRINTOUT ALLLINES ;"CR after each line"
LDX #9
JSR PRBL2
PRINTOUT CR_LF ;"CR/LF after each line"
LDX #9
JSR PRBL2
PRINTOUT DIR ;"Dir listing"
LDX #9
JSR PRBL2
PRINTOUT QUITMSG ;"Quit"
JSR CROUT
PRINTOUT CHOOSE ;Print prompt
GET LDA #0
STA STROBE
JSR RDKEY ;Get a key
AND #%11011111 ;Convert from lower to upper case
CMP #"C" ;Check if it's a valid keypress
BEQ VALID
CMP #"R"
BEQ VALID
CMP #"L"
BEQ VALID
CMP #$9F ;Question mark?
BEQ GOTO_BAS
CMP #"Q"
BEQ GOTO_BAS
JSR NOISE ;If not valid, complain
JMP GET ;Try again
GOTO_BAS STA PASS2BAS
RTS
VALID LDX #0 ;Zero out flags for
STX EACHLINE ; CR after each line flag
STX LINEFEED ; LF flag
CMP #"C" ;If plain convert, begin processing
BEQ BEGIN
INC EACHLINE ;Both remaining options need CR after each line
CMP #"E"
BEQ BEGIN ;If "E", begin
INC LINEFEED ; otherwise set linefeed flag
BEGIN LDA #1
JMP GOTO_BAS
JSR CLOSE ;Close all files
JSR MLI
HEX C4 ;GET_FILE_INFO
DA INFOPARM ;Get info about input file
BCC OK0
JMP ERROR
OK0 LDA FILETYPE
CMP #$1A ;Is it a AWP file?
BEQ OK00
JSR NOISE ;NO -> exit
JSR CROUT
JSR CROUT
PRINTOUT NOTAWP
JMP ENDERR
OK00 JSR MLI ;Open input file
HEX C8 ;Open
DA OPENPARM
BCC OK1 ;If no errors
JMP ERROR
OK1 LDA INNUM ;Copy reference number
STA INNUM3 ; to read parm table
JSR MLI ;Delete old output file, if it exists
HEX C1 ;Destroy
DA DELPARM
BCC OK2 ;No error
CMP #$46 ;If a file not found error
BEQ OK2 ; it's OK
JMP ERROR
OK2 JSR MLI ;Create the output file
HEX C0 ;Create
DA CRTPARM
BCC OK3
JMP ERROR
OK3 JSR MLI ;Open output file
HEX C8 ;Open
DA OUTPARM
BCC OK4
JMP ERROR
OK4 LDA OUTNUM ;Get reference number
STA OUTNUM2 ;Store it in write parm table
LDA #>300 ;Read 300 byte header
STA READLEN+1
LDA #<300
STA READLEN
JSR READ ;Read 1st 300 bytes
NEXT LDA #0
STA READLEN+1
STA CR_FLAG ;Zero out CR_FLAG
LDA #2
STA READLEN
JSR READ ;Read 2 bytes
BCC OK6
JMP ERROR
OK6 LDA DATABUF+1
CMP #$FF ;End of file?
BNE CMPNEXT
JSR CLOSE ;If EOF, close files
JMP MENU ;Go back to main menu
CMPNEXT CMP #$D0 ;Blank CR line?
BNE CMPNEXT2
LDA #0 ;Prepare to write one byte
STA REQLEN+1
LDA #1
STA REQLEN
LDA #13 ;Carriage return
STA DATABUF
JMP ADD_LF ;Determine if adding LF after each line
CMPNEXT2 CMP #$D1 ;Is it a format option?
BLT PROCESS
JMP NEXT ; if so, skip it & get next
PROCESS LDA #2
STA READLEN
JSR READ ;Get next two header bytes
LDA DATABUF+1
AND #%10000000 ;Isolate high bit
CMP #%10000000
BLT NO_CR
LDA #1
STA CR_FLAG
NO_CR LDA DATABUF+1
AND #%01111111 ;Isolate low 7 bits
STA READLEN
STA REQLEN
JSR READ ;Read the actual text bytes
LDX #0
CHECK LDA DATABUF,X
CMP #$B ;Sticky space
BNE NEXTOPT
LDA #$20 ;Change sticky space to normal space
STA DATABUF,X
NEXTOPT CMP #$20
BGE NEXTCHAR ;If not format option, continue
TXA
TAY
SQUEEZE LDA DATABUF+1,Y ;Move everything left, eliminating
STA DATABUF,Y ; format option
INY
CPY REQLEN
BNE SQUEEZE
DEX ;To cancel the next INX
DEC REQLEN
NEXTCHAR INX
CPX REQLEN
BNE CHECK
LDA EACHLINE
BNE ADD_CR ;Each line flag is set
LDA CR_FLAG
BEQ WRITE ;Normal CR at EOLN is not set
ADD_CR LDX REQLEN
INC REQLEN
LDA #13
STA DATABUF,X
ADD_LF LDA LINEFEED
BEQ WRITE ;LF flag is not set
LDX REQLEN
INC REQLEN
LDA #10 ;ASCII LF
STA DATABUF,X
WRITE JSR MLI ;Write to output file
HEX CB ;Write
DA WRTPARM
BCC OK7
JMP ERROR
OK7 JMP NEXT ;Do another line
* Handle an MLI error
ERROR PHA ;Save error code
JSR CLOSE ;Close all files
JSR NOISE ;Sound beep
JSR CROUT
PRINTOUT ERMSG ;Write error message
PRINTOUT ERTYPE ;Print error type message
PLA ; and the error number
STA SAVE
JSR PRBYTE
PRINTOUT DASH ; and the dash after it
LDA SAVE ;Get error number
* Determine what error occurred, and print appropriate message
LDX #0
ERRLOOP LDA ERRTABLE,X ;Check for each error type
CMP SAVE
BEQ ERROUT ;Exit if a match
INX
CPX #12
BNE ERRLOOP ;If no match, x = 12 (offset for misc error)
ERROUT TXA ;Double the value in X-reg
STA SAVE ; to get offset for printing error message
CLC
ADC SAVE
TAX
INX
LDA ERRADDR,X ;Get addr of error message
TAY
DEX
LDA ERRADDR,X
TAX
JSR MSGOUT ;Print error message
ENDERR PRINTOUT ANYKEY ;"Press Return to continue"
LDA #0
STA STROBE ;Clear strobe
JSR RDKEY ;Get that key
JMP MENU
* CLOSE - closes all files
CLOSE JSR MLI
HEX CC ;Close
DA CLSPARM
RTS
READ JSR MLI ;Read a line from input file
HEX CA ;READ
DA READPARM
RTS
* MSGOUT - prints out message (ending in $00) whose high byte
* is in the Y-reg and low byte is in the X-reg
MSGOUT STX ADDR+1
STY ADDR+2
LDX #0
ADDR LDA $FFFF,X
CMP #0
BEQ :OK
JSR COUT
INX
JMP ADDR
:OK RTS
*
* NOISE - Sound buzz
*
NOISE LDX #$50
LOOP2 DEX
LDA #$1D
JSR WAIT
LDA $C030
CPX #0
BNE LOOP2
RTS
TOPLINE ASC "Works Processor"8D00
SECLINE ASC "AppleWorks to Text File Utility"8D00
THRDLINE ASC "Written by Mike Jetzer"8D00
FRTHLINE ASC "Copyright(C) 1989 by MicroSPARC, Inc."8D00
CONVLINE ASC "C - Convert AWP to TXT"8D00
ALLLINES ASC "R - Add CR after each line"8D00
CR_LF ASC "L - Add CR/LF after each line"8D00
DIR ASC "? - Catalog/Set Prefix"8D00
QUITMSG ASC "Q - Quit"8D00
CHOOSE ASC "Choose - "00
ERMSG ASC "Unexpected error."8D00
ERTYPE ASC "ProDOS error $"00
DASH ASC " - "00
IOERR ASC "I/O Error"8D00
WRITPROT ASC "Write Protected"8D00
BADNAME ASC "Bad Pathname Syntax"8D00
NOPATH ASC "Nonexistent Pathname"8D00
NOMOUNT ASC "Vol Not Mounted"8D00
NOTFOUND ASC "File Not Found"8D00
DISKFULL ASC "Disk Full"8D00
DIRFULL ASC "Volume Dir Full"8D00
FILEOPEN ASC "File Already Open"8D00
FILELOCK ASC "Output File Locked"8D00
NOTPROD ASC "Not a ProDOS Disk"8D00
BADBIT ASC "Bad Vol Bitmap"8D00
MISCERR ASC "Misc. Error"8D00
NOTAWP ASC "Input file is not of type AWP"8D00
ANYKEY ASC "Press Return to continue "00
* Table of ProDOS error message types
ERRTABLE DFB $27,$2B,$40,$44,$45,$46,$48,$49,$4E,$50,$52,$5A
* Table of error message addresses
ERRADDR DA IOERR
DA WRITPROT
DA BADNAME
DA NOPATH
DA NOMOUNT
DA NOTFOUND
DA DISKFULL
DA DIRFULL
DA FILELOCK
DA FILEOPEN
DA NOTPROD
DA BADBIT
DA MISCERR
SAVE DS 1
EACHLINE DS 1
LINEFEED DS 1
CR_FLAG DS 1
*
* MLI parameter tables
*
OPENPARM HEX 03 ;Parm table to open input file
DA INPATH
DA FILEBUF
INNUM DS 1
OUTPARM HEX 03 ;Parm table to open output file
DA OUTPATH
DA FILE2BUF
OUTNUM DS 1
READPARM HEX 04 ;Parm table to read input file
INNUM3 DS 1
DA DATABUF
READLEN DS 2
DS 2
WRTPARM HEX 04 ;Parm table to write output file
OUTNUM2 DS 1
DA DATABUF
REQLEN DS 2 ;Requested length to write
DS 2 ;Actual length written - ignored
CLSPARM HEX 01 ;Parm table to close all files
HEX 00 ;Close ALL files
CRTPARM HEX 07 ;Parm table to create output file
DA OUTPATH
HEX C3 ;Access bits; set for full access
HEX 04 ;Type TXT
DS 2 Aux file type; not used
HEX 01 ;Storage type; seedling file
DS 2 ;Date; MLI sets this
DS 2 ;Time; MLI sets this
DELPARM HEX 01 ;Parm table to delete existing output file
DA OUTPATH
INFOPARM HEX 0A ;GET_FILE_INFO parm table
DA INPATH
DS 1
FILETYPE DS 1
DS 13
* Buffers for input & output pathnames
INPATH DS 65 ;1 for length, 64 for pathname
OUTPATH DS 65